\section{流程控制}

如不特别指定，PHP和大多数语言一样，将从上到下执行语句。而流程控制语句则会改变程序运行顺序。

\subsection{if}

if 结构是很多语言包括 PHP 在内最重要的特性之一，它允许按照条件执行代码片段。

\begin{lstlisting}
<?php
if ($a > $b) {
  echo "a is bigger than b";
  $b = $a;
}
?>
\end{lstlisting}

if 语句可以无限层地嵌套在其它 if 语句中，这给程序的不同部分的条件执行提供了充分的弹性。

\subsection{else}
else 延伸了 if 语句，可以在 if 语句中的表达式的值为 FALSE 时执行语句。

\begin{lstlisting}
<?php
if ($a > $b) {
  echo "a is greater than b";
} else {
  echo "a is NOT greater than b";
}
?>
\end{lstlisting}

\subsection{elseif / else if}
elseif，和此名称暗示的一样，是 if 和 else 的组合。和 else 一样，它延伸了 if 语句，可以在原来的 if 表达式值为 FALSE 时执行不同语句。但是和 else 不一样的是，它仅在 elseif 的条件表达式值为 TRUE 时执行语句。

\begin{lstlisting}
<?php
if ($a > $b) {
    echo "a is bigger than b";
} elseif ($a == $b) {
    echo "a is equal to b";
} else {
    echo "a is smaller than b";
}
?>
\end{lstlisting}

\subsection{switch}
switch 语句类似于具有同一个表达式的一系列 if 语句。很多场合下需要把同一个变量（或表达式）与很多不同的值比较，并根据它等于哪个值来执行不同的代码。这正是 switch 语句的用途。

\begin{lstlisting}
<?php
switch ($i) {
case "apple":
    echo "i is apple";
    break;
case "bar":
    echo "i is bar";
    break;
case "cake":
    echo "i is cake";
    break;
}
?>
\end{lstlisting}

\subsection{while}
while 语句的含意很简单，它告诉 PHP 只要 while 表达式的值为 TRUE 就重复执行嵌套中的循环语句。表达式的值在每次开始循环时检查，所以即使这个值在循环语句中改变了，语句也不会停止执行，直到本次循环结束。有时候如果 while 表达式的值一开始就是 FALSE，则循环语句一次都不会执行。

\begin{lstlisting}
<?php
$i = 1;
while ($i <= 10) {
    echo $i++;
}
?>
\end{lstlisting}

\subsection{break}
break 结束当前 for，foreach，while，do-while 或者 switch 结构的执行。

\subsection{continue}
continue 在循环结构用用来跳过本次循环中剩余的代码并在条件求值为真时开始执行下一次循环。

\begin{lstlisting}
<?php
while (list ($key, $value) = each($arr)) {
    if (!($key % 2)) { // skip odd members
        continue;
    }
    do_something_odd($value);
}
?>
\end{lstlisting}

\subsection{do while}
do-while 循环和 while 循环非常相似，区别在于表达式的值是在每次循环结束时检查而不是开始时。和一般的 while 循环主要的区别是 do-while 的循环语句保证会执行一次（表达式的真值在每次循环结束后检查）。

\begin{lstlisting}
<?php
$i = 0;
do {
   echo $i;
} while ($i > 0);
?>
\end{lstlisting}

\subsection{for}
for 循环是 PHP 中最复杂的循环结构。for 循环语法为：

\begin{lstlisting}
for (expr1; expr2; expr3)
    statement
\end{lstlisting}

第一个表达式（expr1）在循环开始前无条件求值（并执行）一次。

第二个表达式（expr2） 在每次循环开始前求值。如果值为 TRUE，则继续循环，执行嵌套的循环语句。如果值为 FALSE，则终止循环。

第三个表达式（expr3） 在每次循环之后被求值（并执行）。

\begin{lstlisting}
<?php
for ($i = 1; $i <= 10; $i++) {
    echo $i;
}
\end{lstlisting}

\subsection{foreach}
foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象，

\begin{lstlisting}
<?php
$a = array(1, 2, 3, 17);

foreach ($a as $v) {
   echo "Current value of \$a: $v.\n";
}
\end{lstlisting}

\subsection{流程控制的替代语句}
PHP 提供了一些流程控制的替代语法，包括 if，while，for，foreach 和 switch。替代语法的基本形式是把左花括号（{）换成冒号（:），把右花括号（}）分别换成 endif;，endwhile;，endfor;，endforeach; 以及 endswitch;。

\begin{lstlisting}
<?php
if ($a == 5):
    echo "a equals 5";
    echo "...";
elseif ($a == 6):
    echo "a equals 6";
    echo "!!!";
else:
    echo "a is neither 5 nor 6";
endif;
?>
\end{lstlisting}

\subsection{return}
如果在一个函数中调用 return 语句，将立即结束此函数的执行并将它的参数作为函数的值返回。如果在全局范围中调用，则当前脚本文件中止运行。如果当前脚本文件是被 include 的或者 require 的，则控制交回调用文件。

\subsection{require和include}
include 语句包含并运行指定文件。当一个文件被包含时，其中所包含的代码继承了 include 所在行的变量范围。

require 和 include 几乎完全一样，除了处理失败的方式不同之外。require 在出错时产生编译错误。换句话说将导致脚本中止而 include 只产生警告，脚本会继续运行。

\subsection{require\_once和include\_once}
require\_once 语句和 require 语句完全相同，唯一区别是 PHP 会检查该文件是否已经被包含过，如果是则不会再次包含。include\_once 语句在脚本执行期间包含并运行指定文件。此行为和 include 语句类似，唯一区别是如果该文件中已经被包含过，则不会再次包含。如同此语句名字暗示的那样，只会包含一次。
